#pragma once

#include "ball_mapping.h"
#include <vector>
#include <deque>

typedef struct {
    int frame_idx;
    com_point_t position;  // 3D位置
    com_point_t velocity;  // 速度矢量
    float speed;           // 速度大小
    float acceleration;    // 加速度大小
    int valid;             // 数据是否有效
} ball_motion_t;

typedef struct {
    int frame_idx;         // 击球点帧号
    com_point_t position;  // 击球点位置
    com_point_t velocity_before;  // 击球前速度
    com_point_t velocity_after;   // 击球后速度
    float speed_change;    // 速度变化量
    float confidence;      // 置信度
} hit_point_t;

class BallMotionAnalyzer {
private:
    std::deque<ball_motion_t> motion_history_;
    int max_history_frames_;
    float speed_threshold_;
    float acceleration_threshold_;
    float direction_change_threshold_;
    
public:
    BallMotionAnalyzer(int max_history = 10, 
                      float speed_thresh = 2.0f, 
                      float accel_thresh = 5.0f,
                      float dir_change_thresh = 60.0f);
    
    // 添加新的运动数据
    void addMotionData(int frame_idx, const ball_info_t& ball_info);
    
    // 计算运动矢量
    ball_motion_t calculateMotion(int frame_idx, const ball_info_t& ball_info);
    
    // 检测击球点
    std::vector<hit_point_t> detectHitPoints();
    
    // 平滑滤波
    com_point_t smoothPosition(const com_point_t& current_pos);
    
    // 获取运动历史
    const std::deque<ball_motion_t>& getMotionHistory() const { return motion_history_; }
    
    // 清除历史数据
    void clearHistory() { motion_history_.clear(); }
};
